﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Cesave.Domain.PermisosModule.Entities;
using System.ComponentModel;
using Cesave.Application.Permisos.ServiceAgent;
using System.Windows.Forms;

namespace Cesave.Presentation.Permisos.WinForms.Client.ViewModels.Catalogs.Cultivos
{
    /// <summary>
    /// Sección de manejo de propiedades de cultivo.
    /// </summary>
    public partial class CultivosViewModel
    {
        #region Private properties

        /// <summary>
        /// Propiedades del cultivo.
        /// </summary>
        private CultivosPropiedad _propiedades;

        /// <summary>
        /// Propiedades actuales del cultivo.
        /// </summary>
        private CultivosPropiedad _propiedad;

        #endregion

        #region Public properties

        /// <summary>
        /// Propiedades del cultivo.
        /// </summary>
        public CultivosPropiedad Propiedades
        {
            get
            {
                return _propiedades;
            }
            private set
            {
                _propiedades = value;
                if (_propiedades != null)
                    RaisePropertyChanged("Propiedades");
            }
        }

        /// <summary>
        /// Propiedades actuales del cultivo.
        /// </summary>
        public CultivosPropiedad Propiedad
        {
            get
            {
                return _propiedad;
            }
            private set
            {
                _propiedad = value;
                if (_propiedad != null)
                    RaisePropertyChanged("Propiedad");
            }
        }

        #endregion

        #region Private methods

        /// <summary>
        /// Carga las propiedades del cultivo.
        /// </summary>
        private void LoadPropiedades()
        {
            StartWaiting();
            using (BackgroundWorker worker = new BackgroundWorker())
            {
                worker.DoWork += (sender, e) =>
                {
                    using (PermisosModuleServiceWrapper service = new PermisosModuleServiceWrapper())
                    {
                        e.Result = service.FindCultivosPropiedades(Cultivo.CultivoGuid, Ciclo.CicloGuid, _pusSettings.Junta.JuntaGuid);
                    }
                };
                worker.RunWorkerCompleted += (sender, e) =>
                {
                    EndWaiting();
                    if (!e.Cancelled && e.Error == null)
                        Propiedades = e.Result as CultivosPropiedad;
                    else if (e.Error != null)
                        ShowMessage(e.Error.Message);
                };
                worker.WorkerSupportsCancellation = true;
                worker.RunWorkerAsync();
            }
        }

        #endregion

        #region Event methods

        /// <summary>
        /// Envía los cambios realizados a las propiedades del cultivo.
        /// </summary>
        private void SavePropiedades(object s, EventArgs args)
        {
            using (BackgroundWorker worker = new BackgroundWorker())
            {
                worker.DoWork += (sender, e) =>
                {
                    using (PermisosModuleServiceWrapper service = new PermisosModuleServiceWrapper())
                    {
                        service.ChangeCultivosPropiedad(Propiedad);
                    }
                };
                worker.RunWorkerCompleted += (sender, e) =>
                {
                    if (e.Error != null)
                        ShowMessage(e.Error.Message);
                };
                worker.WorkerSupportsCancellation = true;
                worker.RunWorkerAsync();
            }
        }

        /// <summary>
        /// Identifica las propiedades del cultivo actulmente seleccionadas en la vista.
        /// </summary>
        private void SetCurrentPropiedades(object sender, EventArgs e)
        {
            BindingSource bindingSource = sender as BindingSource;
            if (bindingSource != null && bindingSource.Current != null)
                Propiedad = bindingSource.Current as CultivosPropiedad;
        }

        /// <summary>
        /// Se ejecuta cuando la propiedad Propiedades cambia de valor.
        /// </summary>
        private void OnPropiedadesPropertyChanged()
        {
            _view.cultivosPropiedadesBindingSource.DataSource = Propiedades;
            _view.cultivosPropiedadesBindingSource.CurrentChanged += SetCurrentPropiedades;
            SetCurrentPropiedades(_view.cultivosPropiedadesBindingSource, new EventArgs());
        }

        #endregion

    }
}
